package com.sanbi.shield.server.facade.utils;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 日期工具类
 *
 * @author XiaoQingqing
 * @since 2024/08/20
 */
@Slf4j
public class DateUtils {
    /**
     * GMT时区ID
     */
    public static final ZoneId GMT_ZONE_ID = ZoneId.of("Z");

    /**
     * 转换时区
     *
     * @param localDateTime 时间
     * @param sourceZoneId  源时区
     * @param targetZoneId  目标时区
     * @return 时间
     */
    public static LocalDateTime transformZone(LocalDateTime localDateTime, ZoneId sourceZoneId, ZoneId targetZoneId){
        if(null == localDateTime){
            return null;
        }
        ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, sourceZoneId);
        return zonedDateTime.withZoneSameInstant(targetZoneId).toLocalDateTime();
    }

    /**
     * 格式化时间
     *
     * @param localDateTime 时间
     * @param sourceZoneId  源时区
     * @param targetZoneId  目标时区
     * @param formatter     格式
     * @return 格式化时间字符串
     */
    public static String format(LocalDateTime localDateTime, ZoneId sourceZoneId, ZoneId targetZoneId, DateTimeFormatter formatter){
        if(null == localDateTime){
            return null;
        }
        ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, sourceZoneId);
        return zonedDateTime.withZoneSameInstant(targetZoneId).format(formatter);
    }

    /**
     * 以零时区为基准格式化时间
     *
     * @param localDateTime 时间
     * @param targetZoneId  目标时区
     * @param formatter     格式
     * @return 格式化时间字符串
     */
    public static String formatFromGMT(LocalDateTime localDateTime, ZoneId targetZoneId, DateTimeFormatter formatter){
        return format(localDateTime, GMT_ZONE_ID, targetZoneId, formatter);
    }
}
